<html>
    <head>
        <title>IDataFilter服务， 启用/禁用数据过滤器 </title>
    </head>
    <body>
        <script>
            /*
                        二、IDataFilter服务， 启用/禁用数据过滤器  

                                   1、使用方法：

                                            你可以使用 IDataFilter 服务来控制过滤器。

                                                    eg:
                                                        using System;
                                                        using System.Collections.Generic;
                                                        using System.Threading.Tasks;
                                                        using Volo.Abp;
                                                        using Volo.Abp.Data;
                                                        using Volo.Abp.DependencyInjection;
                                                        using Volo.Abp.Domain.Repositories;

                                                        namespace Acme.BookStore
                                                        {
                                                            public class MyBookService : ITransientDependency
                                                            {
                                                                private readonly IDataFilter _dataFilter;
                                                                private readonly IRepository<Book, Guid> _bookRepository;

                                                                public MyBookService(
                                                                    IDataFilter dataFilter,
                                                                    IRepository<Book, Guid> bookRepository)
                                                                {
                                                                    _dataFilter = dataFilter; // 注入过滤器管理服务
                                                                    _bookRepository = bookRepository;
                                                                }

                                                                public async Task<List<Book>> GetAllBooksIncludingDeletedAsync()
                                                                {
                                                                    // 临时性禁用软删除过滤器
                                                                    using (_dataFilter.Disable<ISoftDelete>()) //  禁用软删除过滤器
                                                                    {
                                                                        return await _bookRepository.GetListAsync();
                                                                    }
                                                                }
                                                            }
                                                        }

                                                将IDataFilter服务注入你的类。

                                                在using语句中使用Disable方法创建一个代码块，其中ISoftDelete过滤器在其中被禁用。


                                                除了 IDataFilter.Disable<T>()方法外，IDataFilter还有以下方法：

                                                    ①、IDataFilter.Enable<T>()方法:

                                                                可用于启用过滤器。Enable和Disable方法可用于以嵌套方式定义内部作用域。
                                                                
                                                    ②、IDataFilter.IsEnabled<T>()方法：

                                                                可用于检查过滤器当前是否启用

                                            为了取保过滤器被重置为之前的状态，请确保在using语句块中使用 Disable 和 Enable 方法。 
                                        
                                            
                                2、通用IDataFilter服务  IDataFilter<T>:

                                            IDataFilter 有一个泛型版本，  IDataFilter<TFilter> 它根据"过滤器类型"注入更受限制的 和 显式的数据过滤器。

                                                eg:

                                                    using System;
                                                    using System.Collections.Generic;
                                                    using System.Threading.Tasks;
                                                    using Volo.Abp;
                                                    using Volo.Abp.Data;
                                                    using Volo.Abp.DependencyInjection;
                                                    using Volo.Abp.Domain.Repositories;

                                                    namespace Acme.BookStore
                                                    {
                                                        public class MyBookService : ITransientDependency
                                                        {
                                                            private readonly IDataFilter<ISoftDelete> _softDeleteFilter;
                                                            private readonly IRepository<Book, Guid> _bookRepository;

                                                            public MyBookService(
                                                                IDataFilter<ISoftDelete> softDeleteFilter,
                                                                IRepository<Book, Guid> bookRepository)
                                                            {
                                                                _softDeleteFilter = softDeleteFilter;
                                                                _bookRepository = bookRepository;
                                                            }

                                                            public async Task<List<Book>> GetAllBooksIncludingDeletedAsync()
                                                            {
                                                                // 暂时性禁用软删除过滤器
                                                                using (_softDeleteFilter.Disable())
                                                                {
                                                                    return await _bookRepository.GetListAsync();
                                                                }
                                                            }
                                                        }
                                                    }

                                            此用法在注入IDataFilter<T>服务时确定过滤器类型。

                                            在这种情况下，你可以使用Disable()和Enable()方法而无需指定过滤器类型。

                                            还是记得要在using中使用 Disable 和 Enable 方法，这样可以恢复到之前的过滤器状态。

                    */
        </script>
    </body>
</html>